View Javadoc
1   package edu.jiangxin.apktoolbox.file;
2   
3   import edu.jiangxin.apktoolbox.file.core.EncoderConvert;
4   import edu.jiangxin.apktoolbox.file.core.EncoderDetector;
5   import edu.jiangxin.apktoolbox.swing.extend.autocomplete.AutoCompleteComboBox;
6   import edu.jiangxin.apktoolbox.swing.extend.EasyPanel;
7   import edu.jiangxin.apktoolbox.swing.extend.FileListPanel;
8   import edu.jiangxin.apktoolbox.utils.Constants;
9   import edu.jiangxin.apktoolbox.utils.FileUtils;
10  import org.apache.commons.lang3.StringUtils;
11  
12  import javax.swing.*;
13  import java.awt.*;
14  import java.awt.event.*;
15  import java.io.File;
16  import java.io.IOException;
17  import java.nio.charset.Charset;
18  import java.util.ArrayList;
19  import java.util.List;
20  import java.util.Set;
21  import java.util.TreeSet;
22  
23  /**
24   * @author jiangxin
25   * @author 2019-04-12
26   *
27   */
28  public class EncodeConvertPanel extends EasyPanel {
29      private static final long serialVersionUID = 1L;
30  
31      private FileListPanel srcPanel;
32  
33      private JPanel optionPanel;
34  
35      private JTextField suffixTextField;
36  
37      private JCheckBox autoDetectCheckBox;
38  
39      private AutoCompleteComboBox<String> fromComboBox;
40  
41      private JCheckBox recursiveCheckBox;
42  
43      private AutoCompleteComboBox<String> toComboBox;
44  
45      private JPanel operationPanel;
46  
47      public EncodeConvertPanel() throws HeadlessException {
48          super();
49      }
50  
51      @Override
52      public void initUI() {
53          setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
54  
55          createSrcPanel();
56          add(srcPanel);
57          add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
58  
59          createOptionPanel();
60          add(optionPanel);
61          add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
62  
63          createOperationPanel();
64          add(operationPanel);
65      }
66  
67      private void createSrcPanel() {
68          srcPanel = new FileListPanel();
69          srcPanel.initialize();
70      }
71  
72      private void createOptionPanel() {
73          optionPanel = new JPanel();
74          optionPanel.setLayout(new BoxLayout(optionPanel, BoxLayout.X_AXIS));
75  
76          JLabel suffixLabel = new JLabel("Suffix:");
77          optionPanel.add(suffixLabel);
78          optionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
79  
80          suffixTextField = new JTextField();
81          suffixTextField.setToolTipText("an array of extensions, ex. {\"java\",\"xml\"}. If this parameter is empty, all files are returned.");
82          suffixTextField.setText(conf.getString("encodeconvert.suffix"));
83          optionPanel.add(suffixTextField);
84          optionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
85  
86          recursiveCheckBox = new JCheckBox("Recursive");
87          recursiveCheckBox.setSelected(true);
88          optionPanel.add(recursiveCheckBox);
89          optionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
90  
91          JLabel fromLabel = new JLabel("From:");
92          optionPanel.add(fromLabel);
93          optionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
94  
95          fromComboBox = new AutoCompleteComboBox<String>();
96          fromComboBox.initialize();
97          fromComboBox.setEnabled(false);
98          optionPanel.add(fromComboBox);
99          optionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
100 
101         autoDetectCheckBox = new JCheckBox("Auto Detect");
102         autoDetectCheckBox.setSelected(true);
103         autoDetectCheckBox.addItemListener(e -> fromComboBox.setEnabled(!(e.getStateChange() == ItemEvent.SELECTED)));
104         optionPanel.add(autoDetectCheckBox);
105         optionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
106 
107         JLabel toLabel = new JLabel("To:");
108         optionPanel.add(toLabel);
109         optionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
110 
111         toComboBox = new AutoCompleteComboBox<String>();
112         toComboBox.initialize();
113         toComboBox.setSelectedItem(conf.getString("encodeconvert.to"));
114         optionPanel.add(toComboBox);
115 
116         for (String charset : Charset.availableCharsets().keySet()) {
117             fromComboBox.addItem(charset);
118             toComboBox.addItem(charset);
119         }
120     }
121 
122     private void createOperationPanel() {
123         operationPanel = new JPanel();
124         operationPanel.setLayout(new BoxLayout(operationPanel, BoxLayout.X_AXIS));
125         JButton convertButton = new JButton("Convert");
126         convertButton.addActionListener(new ConvertButtonActionListener());
127 
128         operationPanel.add(convertButton);
129     }
130 
131     private class ConvertButtonActionListener implements ActionListener {
132         @Override
133         public void actionPerformed(ActionEvent e) {
134             conf.setProperty("encodeconvert.suffix", suffixTextField.getText());
135             conf.setProperty("encodeconvert.to", toComboBox.getSelectedItem().toString());
136 
137             try {
138                 List<File> fileList = new ArrayList<>();
139                 for (File file : srcPanel.getFileList()) {
140                     String[] extensions = null;
141                     if (StringUtils.isNotEmpty(suffixTextField.getText())) {
142                         extensions = suffixTextField.getText().split(",");
143                     }
144                     fileList.addAll(FileUtils.listFiles(file, extensions, recursiveCheckBox.isSelected()));
145                 }
146                 Set<File> fileSet = new TreeSet<>(fileList);
147                 fileList.clear();
148                 fileList.addAll(fileSet);
149 
150                 for (File file : fileList) {
151                     String fromEncoder;
152                     if (autoDetectCheckBox.isSelected()) {
153                         fromEncoder = EncoderDetector.judgeFile(file.getCanonicalPath());
154                     } else {
155                         fromEncoder = fromComboBox.getSelectedItem().toString();
156                     }
157                     String toEncoder = toComboBox.getSelectedItem().toString();
158                     logger.info("processing: {} from {} to {}", file.getCanonicalPath(), fromEncoder, toEncoder);
159                     EncoderConvert.encodeFile(file.getCanonicalPath(), fromEncoder, toEncoder);
160                     logger.info("processed");
161                 }
162 
163                 logger.info("convert finish");
164             } catch (IOException e1) {
165                 logger.error("convert fail", e1);
166             }
167         }
168     }
169 }